In [1]:
import altair as alt
import pandas as pd
from vega_datasets import data
#This part of the plot is too large to submit if the output is generate, I am struggling with submiting to github as well...
# But it works, the plot is just not shown, u can run it.
alt.data_transformers.disable_max_rows()
url = "https://github.com/UIUC-iSchool-DataViz/is445_data/raw/main/ufo-scrubbed-geocoded-time-standardized-00.csv"
df = pd.read_csv(url, header=None)
df.columns = [
'Date_Time', 'City', 'State', 'Country', 'Shape', 'Duration',
'Duration_Reported', 'Comments', 'Date_Posted', 'Latitude', 'Longitude'
]
df['Date_Time'] = pd.to_datetime(df['Date_Time'], errors='coerce')
df['Year'] = df['Date_Time'].dt.year
df_us = (df[(df['Country'] == 'us') &
(~df['State'].str.lower().isin(['ak', 'hi']))]
.assign(State=df['State'].str.upper()))
state_abbr_to_full = {
"AL": "Alabama", "AZ": "Arizona", "AR": "Arkansas", "CA": "California",
"CO": "Colorado", "CT": "Connecticut", "DE": "Delaware", "FL": "Florida", "GA": "Georgia",
"ID": "Idaho", "IL": "Illinois", "IN": "Indiana", "IA": "Iowa",
"KS": "Kansas", "KY": "Kentucky", "LA": "Louisiana", "ME": "Maine", "MD": "Maryland",
"MA": "Massachusetts", "MI": "Michigan", "MN": "Minnesota", "MS": "Mississippi",
"MO": "Missouri", "MT": "Montana", "NE": "Nebraska", "NV": "Nevada", "NH": "New Hampshire",
"NJ": "New Jersey", "NM": "New Mexico", "NY": "New York", "NC": "North Carolina",
"ND": "North Dakota", "OH": "Ohio", "OK": "Oklahoma", "OR": "Oregon", "PA": "Pennsylvania",
"RI": "Rhode Island", "SC": "South Carolina", "SD": "South Dakota", "TN": "Tennessee",
"TX": "Texas", "UT": "Utah", "VT": "Vermont", "VA": "Virginia", "WA": "Washington",
"WV": "West Virginia", "WI": "Wisconsin", "WY": "Wyoming"
}
df_us["StateName"] = df_us["State"].map(state_abbr_to_full)
states_list = ['All States'] + sorted(df_us['StateName'].dropna().unique().tolist())
state_selector = alt.param(name='StateSelector', bind=alt.binding_select(options=states_list, name="Select State:"), value='All States')
us_map = alt.topo_feature(data.us_10m.url, 'states')
background = alt.Chart(us_map).mark_geoshape(
fill='lightgray',
stroke='white'
).transform_filter(
'datum.id != 2 && datum.id != 15'
).properties(
width=800,
height=500
)
slider = alt.binding_range(min=df_us['Year'].min(), max=df_us['Year'].max(), step=1, name='Year:')
selection = alt.param(name='YearSelector', bind=slider, value=df_us['Year'].max())
points_nation = alt.Chart(df_us).mark_circle(size=30, color='red').encode(
longitude='Longitude:Q',
latitude='Latitude:Q',
tooltip=[
alt.Tooltip('City', title='City'),
alt.Tooltip('State', title='State'),
alt.Tooltip('Date_Time', title='Date/Time'),
alt.Tooltip('Shape', title='Shape')
]
).add_params(
selection
).transform_filter(
'datum.Year == YearSelector'
)
main_map = background + points_nation
state_map = alt.Chart(us_map).mark_geoshape(
fill='lightgray',
stroke='black'
).transform_filter(
'datum.properties.name == StateSelector && StateSelector != "All States"'
).add_params(
state_selector
).properties(
width=400,
height=500
)
points_state = alt.Chart(df_us).mark_circle(size=80, color='blue').encode(
longitude='Longitude:Q',
latitude='Latitude:Q',
tooltip=[
alt.Tooltip('City', title='City'),
alt.Tooltip('Date_Time', title='Date/Time'),
alt.Tooltip('Shape', title='Shape')
]
).transform_filter(
'datum.StateName == StateSelector && StateSelector != "All States" && datum.Year == YearSelector'
)
zoomed_map = state_map + points_state
final_map = alt.hconcat(
main_map,
zoomed_map
).resolve_scale(
color='independent'
)
final_map
Out[1]: